package com.dd.machine.base.app;

import android.app.AlarmManager;
import android.app.Application;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.widget.Button;

import com.dd.machine.base.constants.Constants;
import com.dd.machine.base.utils.ExectorManager;
import com.dd.machine.greendao.gen.DaoMaster;
import com.dd.machine.greendao.gen.DaoSession;
import com.dd.machine.main.commons.AppManager;
import com.dd.machine.main.commons.PollingUtils;
import com.dd.machine.main.commons.VoiceUtils;
import com.dd.machine.main.desktop.DeskTopActivity;
import com.dd.machine.main.service.DelteDataService;
import com.dd.machine.main.service.PollingService;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechUtility;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.cookie.CookieJarImpl;
import com.zhy.http.okhttp.cookie.store.PersistentCookieStore;


import java.io.EOFException;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import cn.jpush.android.api.JPushInterface;
import okhttp3.OkHttpClient;

import static com.dd.machine.base.net.NetUtils.isNetworkAvailable;

/**
 * Created by lenovo on 2016/4/18.
 */
@SuppressWarnings("WrongConstant")
public class MyApplication extends Application {

    private DaoMaster.DevOpenHelper mHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    public static MyApplication instances = null;
    public VoiceUtils voiceUtils;
    private static Context context;

    // 一天的毫秒数
    long daySpan = 24 * 60 * 60 * 1000;
    MyIntentThread myThread;

    @Override
    public void onCreate() {
        super.onCreate();
        instances = this;
        context = this;
        //初始化自定义的语音合成的类
        voiceUtils = new VoiceUtils();
        voiceUtils.init(this);
        JPushInterface.init(this);//极光推送初始化
        setDatabase();
        //配置ImageLoader
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
                //不要缓存不同尺寸
                .denyCacheImageMultipleSizesInMemory()
                //下载图片线程的优先级
                .threadPriority(Thread.NORM_PRIORITY - 2)
                //设置下载线程的执行器（线程池）
                .taskExecutor(ExectorManager.getInstance().getExectors())
                //设置内存缓存的大小
                .memoryCacheSize((int) Runtime.getRuntime().maxMemory() / 8)
                //设置磁盘缓存大小
                .diskCacheSize(50 * 1024 * 1024)
                //设置磁盘缓存文件的命名生成器
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())
                //设置磁盘缓存的路径
//                .discCache(new UnlimitedDiskCache(FileUitlity.getInstance(this).makeDir("imageCache")))
                //
                .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
                //设置具体的图片加载器：
                .imageDownloader(new BaseImageDownloader(this, 60 * 1000, 60 * 1000))
                //生成配置信息
                .build();
        ImageLoader.getInstance().init(config);

        CookieJarImpl cookieJar = new CookieJarImpl(new PersistentCookieStore(getApplicationContext()));
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cookieJar(cookieJar)
                //其他配置
                .build();

        OkHttpUtils.initClient(okHttpClient);

        initPolling();//使用闹钟，开启轮询
        initDeletePolling();
        startCheckIntent();//检查网络情况

//        Thread.setDefaultUncaughtExceptionHandler(restartHandler);


    }

    public static MyApplication getInstances() {
        return instances;
    }

    private void setDatabase() {
        // 通过 DaoMaster 的内部类 DevOpenHelper，你可以得到一个便利的 SQLiteOpenHelper 对象。
        // 可能你已经注意到了，你并不需要去编写「CREATE TABLE」这样的 SQL 语句，因为 greenDAO 已经帮你做了。
        // 注意：默认的 DaoMaster.DevOpenHelper 会在数据库升级时，删除所有的表，意味着这将导致数据的丢失。
        // 所以，在正式的项目中，你还应该做一层封装，来实现数据库的安全升级。
        mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
        db = mHelper.getWritableDatabase();
        // 注意：该数据库连接属于 DaoMaster，所以多个 Session 指的是相同的数据库连接。
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }

    public DaoSession getDaoSession() {
        return mDaoSession;
    }

    public SQLiteDatabase getDb() {
        return db;
    }

    public VoiceUtils getVoiceUtils() {
        return voiceUtils;
    }

    private void initPolling() {
        try {
            final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '00:00:00'");//设置执行时间，为每天0点
            Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));
            long current = startTime.getTime();
            if (System.currentTimeMillis()>startTime.getTime()) {//比较执行时间和当前时间
                current = startTime.getTime() + daySpan;
            }
            Log.e("===更新数据的时间",current+"");
            PollingUtils.startPollingService(context,current, PollingService.class,PollingService.ACTION);//开启轮询获取数据
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    //删除30天之前的数据，并重新上传之前上传失败的订单数据
    private void initDeletePolling(){
        try {
            final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '00:01:00'");//设置执行时间，为每天1点
            Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));
            long current = startTime.getTime();
            if (System.currentTimeMillis()>startTime.getTime()) {//比较执行时间和当前时间
                current = startTime.getTime() + daySpan;
            }
            Log.e("===删除数据的时间",current+"");
            PollingUtils.startPollingService(context,current, DelteDataService.class,DelteDataService.ACTION);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    private void startCheckIntent(){
        if (myThread==null) {
            myThread = new MyIntentThread();
            myThread.start();
        }
    }

    private static class MyIntentThread extends Thread{
        @Override
        public void run() {
            while (true){//设一个死循环，一直检查网络情况
                try {
                    //10分钟检查一次
                    Thread.sleep(5*60*1000);
                    isNetworkAvailable(context);
                    Intent intent = new Intent("network");
                    Bundle bundle = new Bundle();
                    bundle.putBoolean("isNetworkAvailable",isNetworkAvailable(context));
                    intent.putExtras(bundle);
                    LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


            }
        }
    }



    private Thread.UncaughtExceptionHandler restartHandler = new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            restartApp();//发生崩溃异常时,重启应用
        }
    };

    private void restartApp(){
        Log.e("----restart","重启==");
        Intent intent = new Intent(instances,DeskTopActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                        | Intent.FLAG_ACTIVITY_CLEAR_TASK
                |Intent.FLAG_ACTIVITY_NEW_TASK);
        instances.startActivity(intent);
        AppManager.getAppManager().AppExit(this);
        android.os.Process.killProcess(android.os.Process.myPid());  //结束进程之前可以把你程序的注销或者退出代码放在这段代码之前
    }
}
